package gorms

import (
	"context"
	"gorm.io/gorm"
)

// 全局DB连接
var _db *gorm.DB

func GetDB() *gorm.DB {
	return _db
}

func SetDB(db *gorm.DB) {
	_db = db
}

type GormConn struct {
	db *gorm.DB // 数据库连接 ——db
	tx *gorm.DB // 事务专用连接
}

func New() *GormConn {
	return &GormConn{
		db: GetDB(),
		tx: GetDB(),
	}
}

func NewTran() *GormConn {
	return &GormConn{db: GetDB(), tx: GetDB()}
}

func (g *GormConn) Session(ctx context.Context) *gorm.DB {
	return g.db.Session(&gorm.Session{Context: ctx})
}

// Begin 封装一层
func (g *GormConn) Begin() {
	// 这一步很重要，事务的连接需要每次都新建，不能直接连用
	//g.tx = g.tx.Begin() // error invalid transaction
	g.tx = GetDB().Begin()
}

// Rollback 回滚
func (g *GormConn) Rollback() {
	g.tx.Rollback()
}

// Commit 提交
func (g *GormConn) Commit() {
	g.tx.Commit()
}

func (g *GormConn) Tx(ctx context.Context) *gorm.DB {
	return g.tx.WithContext(ctx)
}
